compio_driver\sys\pal\windows/
fd.rs1use std::os::windows::prelude::*;
2
3use windows_sys::Win32::Foundation::HANDLE;
4
5pub type RawFd = HANDLE;
9
10pub use std::os::windows::io::{FromRawHandle as FromRawFd, IntoRawHandle as IntoRawFd};
11
12pub trait AsRawFd {
14 fn as_raw_fd(&self) -> RawFd;
16}
17
18#[derive(Debug)]
20pub enum OwnedFd {
21 File(OwnedHandle),
23 Socket(OwnedSocket),
25}
26
27impl AsRawFd for OwnedFd {
28 fn as_raw_fd(&self) -> RawFd {
29 match self {
30 Self::File(fd) => fd.as_raw_handle() as _,
31 Self::Socket(s) => s.as_raw_socket() as _,
32 }
33 }
34}
35
36impl AsRawFd for RawFd {
37 fn as_raw_fd(&self) -> RawFd {
38 *self
39 }
40}
41
42impl AsRawFd for std::fs::File {
43 fn as_raw_fd(&self) -> RawFd {
44 self.as_raw_handle() as _
45 }
46}
47
48impl AsRawFd for OwnedHandle {
49 fn as_raw_fd(&self) -> RawFd {
50 self.as_raw_handle() as _
51 }
52}
53
54impl AsRawFd for socket2::Socket {
55 fn as_raw_fd(&self) -> RawFd {
56 self.as_raw_socket() as _
57 }
58}
59
60impl AsRawFd for OwnedSocket {
61 fn as_raw_fd(&self) -> RawFd {
62 self.as_raw_socket() as _
63 }
64}
65
66impl AsRawFd for std::process::ChildStdin {
67 fn as_raw_fd(&self) -> RawFd {
68 self.as_raw_handle() as _
69 }
70}
71
72impl AsRawFd for std::process::ChildStdout {
73 fn as_raw_fd(&self) -> RawFd {
74 self.as_raw_handle() as _
75 }
76}
77
78impl AsRawFd for std::process::ChildStderr {
79 fn as_raw_fd(&self) -> RawFd {
80 self.as_raw_handle() as _
81 }
82}
83
84impl From<OwnedHandle> for OwnedFd {
85 fn from(value: OwnedHandle) -> Self {
86 Self::File(value)
87 }
88}
89
90impl From<std::fs::File> for OwnedFd {
91 fn from(value: std::fs::File) -> Self {
92 Self::File(OwnedHandle::from(value))
93 }
94}
95
96impl From<std::process::ChildStdin> for OwnedFd {
97 fn from(value: std::process::ChildStdin) -> Self {
98 Self::File(OwnedHandle::from(value))
99 }
100}
101
102impl From<std::process::ChildStdout> for OwnedFd {
103 fn from(value: std::process::ChildStdout) -> Self {
104 Self::File(OwnedHandle::from(value))
105 }
106}
107
108impl From<std::process::ChildStderr> for OwnedFd {
109 fn from(value: std::process::ChildStderr) -> Self {
110 Self::File(OwnedHandle::from(value))
111 }
112}
113
114impl From<OwnedSocket> for OwnedFd {
115 fn from(value: OwnedSocket) -> Self {
116 Self::Socket(value)
117 }
118}
119
120impl From<socket2::Socket> for OwnedFd {
121 fn from(value: socket2::Socket) -> Self {
122 Self::Socket(OwnedSocket::from(value))
123 }
124}
125
126#[derive(Debug)]
128pub enum BorrowedFd<'a> {
129 File(BorrowedHandle<'a>),
131 Socket(BorrowedSocket<'a>),
133}
134
135impl AsRawFd for BorrowedFd<'_> {
136 fn as_raw_fd(&self) -> RawFd {
137 match self {
138 Self::File(fd) => fd.as_raw_handle() as RawFd,
139 Self::Socket(s) => s.as_raw_socket() as RawFd,
140 }
141 }
142}
143
144impl<'a> From<BorrowedHandle<'a>> for BorrowedFd<'a> {
145 fn from(value: BorrowedHandle<'a>) -> Self {
146 Self::File(value)
147 }
148}
149
150impl<'a> From<BorrowedSocket<'a>> for BorrowedFd<'a> {
151 fn from(value: BorrowedSocket<'a>) -> Self {
152 Self::Socket(value)
153 }
154}
155
156pub trait AsFd {
158 fn as_fd(&self) -> BorrowedFd<'_>;
160}
161
162impl AsFd for OwnedFd {
163 fn as_fd(&self) -> BorrowedFd<'_> {
164 match self {
165 Self::File(fd) => fd.as_fd(),
166 Self::Socket(s) => s.as_fd(),
167 }
168 }
169}
170
171impl AsFd for std::fs::File {
172 fn as_fd(&self) -> BorrowedFd<'_> {
173 self.as_handle().into()
174 }
175}
176
177impl AsFd for OwnedHandle {
178 fn as_fd(&self) -> BorrowedFd<'_> {
179 self.as_handle().into()
180 }
181}
182
183impl AsFd for BorrowedHandle<'_> {
184 fn as_fd(&self) -> BorrowedFd<'_> {
185 (*self).into()
186 }
187}
188
189impl AsFd for socket2::Socket {
190 fn as_fd(&self) -> BorrowedFd<'_> {
191 self.as_socket().into()
192 }
193}
194
195impl AsFd for OwnedSocket {
196 fn as_fd(&self) -> BorrowedFd<'_> {
197 self.as_socket().into()
198 }
199}
200
201impl AsFd for BorrowedSocket<'_> {
202 fn as_fd(&self) -> BorrowedFd<'_> {
203 (*self).into()
204 }
205}
206
207impl AsFd for std::process::ChildStdin {
208 fn as_fd(&self) -> BorrowedFd<'_> {
209 self.as_handle().into()
210 }
211}
212
213impl AsFd for std::process::ChildStdout {
214 fn as_fd(&self) -> BorrowedFd<'_> {
215 self.as_handle().into()
216 }
217}
218
219impl AsFd for std::process::ChildStderr {
220 fn as_fd(&self) -> BorrowedFd<'_> {
221 self.as_handle().into()
222 }
223}